iT邦幫忙

2022 iThome 鐵人賽

DAY 24
0
自我挑戰組

I don't know JS yet系列 第 24

[ Day 24 ] I don't know JS yet - function name scope

  • 分享至 

  • xImage
  •  

今天的學習是 Scope & Closure CH.3 的內容,主要針對 function declaration 及 functional expression 的 scope 做研究。

先複習一下 function declaration 和 function expression 的差別:

// function declaration
function booking(){
    ...
};

// named function expression
var booking = function flight() {
    ...
};

// anonymous function expression
var booking = function() {
    ...
};

今天的學習內容是 function name 的 scope,我們一個個拆解

function declaration

function booking(){
    ...
}

console.log(booking);
// function booking()...

上面的 function declaration 會在 outer/enclosing scope 創建一個 booking 的 identifier,在相同的 scope 可以調用 booking

anonymous function expression

var booking = function() {
    ...
}

在上面的例子,booking 一樣會被建立,因為函式表達式的 function definition 不會 hoist,所以 booking 與 function definition 要等到執行 assignment 的時候才會有連結,那麼 function expression scope 呢 ... ?

The biggest difference between

function declaration scope and function expression scope ?

我們已經知道 function declaration scope 會在 outer/enclosing scope 建立 identifier
那麼 function expression scope 呢?

var booking = function flight() {
    console.log(flight);
};

booking();
// function flight()...

console.log(flight);
// ReferenceError: flight is not defined

**可以看出 named function expression 的作用域是在 function definition 裡面,這就是為什麼 console.log(flight) 會是 ReferenceError 的原因,因為在 scope 裡找不到 flight;

因為 function expression 的作用域在 function definition 裡面,所以 booking() log 出來 function flight()...;

至於 anonymous function expression 因為沒有 identifier 的關係,所以沒有 scope 的問題。

今天份的學習到這邊


上一篇
[ Day 23 ] I don't know JS yet - Shadowing
下一篇
[ Day 25 ] I don't know JS yet - arrow function scope
系列文
I don't know JS yet30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言